/*
 * @Author: Dagon
 * @Date: 2021-03-02 09:23:13
 * @Description: CORS解决跨域问题
 */

 // 跨域其实是由于同源策略衍生的一个问题，当传输协议，域名，端口号任何一个不一样时候就会导致跨域而拒绝访问，但<img src='xxx'> <link href='xxx'> <script src='xxx'></script> 天然具有跨域加载资源
 // 1） 解决方案 jsonp
 //    原理： 利用<script></script>标签没有跨域限制的漏洞，使得网页可以获得从其他来源动态产生的JSON数据（前提是服务器支持）
 //    优点： 实现简单，兼容性好
 //    缺点： 仅支持get方法，容易收到XSS攻击

 // 2） CORS 
 //     原理： 服务端设置 Access-Control-Allow-Origin 以开启CORS。该属性表示那些域名可以访问资源，如设置通配符则表示所有网站均可访问，如设置通配符（*）则表示所有网站均可访问
import { json } from 'body-parser';
import express from 'express';
var app = express()

// CORS: 设置允许跨域中间件
var allowCrossDomain = function (req, res, next) {
  // 设置允许跨域的URL（* 表示允许任意URL访问）
  res.header('Access-Control-Allow-Origin', "*");
  // 设置允许跨域访问的请求头
  res.header('Access-Control-Allow-Headers', 'X-Requested-with, Origin, Content-Type, Accept, Authrization')
  // 设置允许跨域的请求类型
  res.header('Access-Control-Allow-Methods', 'PUT, POST,GET,DELETE,OPTIONS')
  // 设置允许服务器接收 cookie
  res.header('Access-Control-Allow-Credentials', 'true')
  next()
} 

app.use(allowCrossDomain)
// 3) node设置中间件代理 
const http = require('http')
// 第一步： 接受客户端请求
const server = http.createServer((req, res) => {
  // 代理服务器，直接和浏览器直接交互，需要设置CORS 的首部字段
  res.writeHead(200, {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': '*',
    'Access-Control-Allow-Headers': 'Content-Type'
  })

  // 第二部：将请求转发给服务器
  const proxyRequest = http.request({
    host: '127.0.0.1',
    port: 4000,
    url: '/',
    method:req.method,
    headers: req.headers
  },
   // 第三步：收到服务器的响应
   ServerResponse => {
     var body = ''
     ServerResponse.on('data', chunk => {
       body += chunk
     })
    ServerResponse.on('end', () => {
      console.log('The data is ' + body)
      res.end(body)
    })
    .end()
   }
  )

})
server.listen(3000, () => {console.log('中间件服务器地址： http://localhost:3000')})

// 连接服务
const http2 = require('http')
const data = { title: 'fontend', password: '123456'}
const server2 =  http2.createServer((req, res) => {
  if (req.url === '/') {
    res.end(JSON.stringify(data))
  }
})

server2.listen(4000, () => {
  console.log('The server is running at http://localhost:4000')
})

// 4) nginx反向代理
// 原理：类似Node中间件服务器，通过nginx代理服务器实现
// 实现方法： 下载nginx， 修改配置